#include <iostream>

using namespace std;

/*
 * 用法：dynamic_cast<type_id> (expression)
 * 说明：
 * 1.其他三种都是编译时完成的，dynamic_cast是运行时处理的，运行时要进行类型检查。
 * 2.不能用于内置的基本数据类型的强制转换
 * 3.安全的基类和子类之间的转换
 * 4.dynamic_cast转换如果成功的话返回的是指向类的指针或引用，转换失败的话则会返回NULL。
 * 5.使用dynamic_cast进行转换的，基类中一定要有虚函数，否则编译不通过。
 * 6.在类的转换时，在类层次间进行上行转换时，dynamic_cast和static_cast的效果是一样的。在进行下行转换时，dynamic_cast具有类型检查的功能，比static_cast更安全。
 *
 * */

class A{
public:
	// 通过dynamic_cast进行转换的父子类，必须带有虚函数
	virtual void print()
	{
		cout << "A.print" << endl;
	}
};

class B: public A{

	// 重写父类的虚函数
	void print()
	{
		cout << "B.print" << endl;	
	}

};

class C{

};

int main()
{
	A *a = new A();
	A *b = new B();

	B *bp;

	// 父类向子类转换
	bp = dynamic_cast<B *>(a);
	if(bp)
		cout << "--bp not NULL" << endl;
	else
		cout << "--bp is NULL" << endl;
	
	// 子类转换子类
	bp = dynamic_cast<B *>(b);
	if(bp)
		cout << "bp not NULL" << endl;
	else
		cout << "bp is NULL" << endl;

	return 0;
}
